package org.csstudio.sds.ui.internal.properties.view;
import org.csstudio.sds.model.IOption;
import org.eclipse.jface.viewers.AbstractListViewer;
import org.eclipse.jface.viewers.ArrayContentProvider;
import org.eclipse.jface.viewers.CellEditor;
import org.eclipse.jface.viewers.ComboViewer;
import org.eclipse.jface.viewers.ISelection;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.jface.viewers.LabelProvider;
import org.eclipse.jface.viewers.StructuredSelection;
import org.eclipse.swt.SWT;
import org.eclipse.swt.custom.CCombo;
import org.eclipse.swt.events.FocusAdapter;
import org.eclipse.swt.events.FocusEvent;
import org.eclipse.swt.events.KeyAdapter;
import org.eclipse.swt.events.KeyEvent;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.events.TraverseEvent;
import org.eclipse.swt.events.TraverseListener;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
/**
* Cell editor implementation that uses a combo box.
*
* The editor displays a set of {@link IOption}�s. When one of the options is
* chosen, the identifier of that option (see {@link IOption#getIdentifier()})
* is returned as selected value for this cell editor.
*
* @author Sven Wende
*
*/
public class OptionComboBoxCellEditor extends CellEditor {
private AbstractListViewer _viewer;
private CCombo _combobox;
private IOption[] _options;
private IOption _selection;
/**
* Constructor.
*
* @param parent
* the parent composite
* @param options
* the options
* @param style
* the style
*/
public OptionComboBoxCellEditor(Composite parent, IOption[] options,
int style) {
super(parent, style);
assert options != null;
_options = options;
_viewer.setInput(_options);
}
/**
* {@inheritDoc}
*/
@Override
protected Control createControl(Composite parent) {
_combobox = new CCombo(parent, getStyle());
_combobox.setEditable(false);
_combobox.setVisibleItemCount(20);
_viewer = new ComboViewer(_combobox);
_viewer.setLabelProvider(new LabelProvider());
_viewer.setContentProvider(new ArrayContentProvider());
_combobox.setFont(parent.getFont());
_combobox.addKeyListener(new KeyAdapter() {
// hook key pressed - see PR 14201
@Override
public void keyPressed(KeyEvent e) {
keyReleaseOccured(e);
}
});
_combobox.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetDefaultSelected(SelectionEvent event) {
applyEditorValueAndDeactivate();
}
@Override
public void widgetSelected(SelectionEvent event) {
ISelection sel = _viewer.getSelection();
if(sel instanceof IStructuredSelection) {
_selection = (IOption) ((IStructuredSelection) sel).getFirstElement();
applyEditorValueAndDeactivate();
}
}
});
_combobox.addTraverseListener(new TraverseListener() {
@Override
public void keyTraversed(TraverseEvent e) {
if (e.detail == SWT.TRAVERSE_ESCAPE
|| e.detail == SWT.TRAVERSE_RETURN) {
e.doit = false;
}
}
});
_combobox.addFocusListener(new FocusAdapter() {
@Override
public void focusLost(FocusEvent e) {
OptionComboBoxCellEditor.this.focusLost();
}
});
return _combobox;
}
/**
* {@inheritDoc}
*/
@Override
protected Object doGetValue() {
String result = "";
if (_selection != null) {
result = _selection.getIdentifier();
}
return result;
}
/**
* {@inheritDoc}
*/
@Override
protected void doSetFocus() {
_viewer.getControl().setFocus();
}
/**
* {@inheritDoc}
*/
@Override
protected void doSetValue(Object value) {
_viewer.setSelection(new StructuredSelection(value));
}
/**
* Applies the currently selected value and deactivates the cell editor.
*/
void applyEditorValueAndDeactivate() {
Object newValue = doGetValue();
markDirty();
boolean isValid = isCorrect(newValue);
setValueValid(isValid);
fireApplyEditorValue();
deactivate();
}
/**
* {@inheritDoc}
*/
@Override
protected void focusLost() {
if (isActivated()) {
applyEditorValueAndDeactivate();
}
}
/**
* {@inheritDoc}
*/
@Override
protected void keyReleaseOccured(KeyEvent keyEvent) {
if (keyEvent.character == '\u001b') { // Escape character
fireCancelEditor();
} else if (keyEvent.character == '\t') { // tab key
applyEditorValueAndDeactivate();
}
}
}